[iOS] Parse からの乗り換えに最適!Amazon SNS に Push データを移行する方法
はじめに
すでにアナウンスがされているように、mBaaSであるParseは、そのサービスを来年2017年1月下旬に終了します。
Parseを使って動いていたアプリは、そのサービスの受け皿を別で用意する必要があります。
今回は、その一環として、Amazon SNSに、Push用の端末情報データの移行を行ってみたいと思います。
流れ
Amazon SNS から APNs を介して、Parse で配信していたのと同じ端末(今回は特定の端末)に向けて Push配信を実現するところまでやってみます。
※今回の手順は、AWS Solutions Architect ブログ: Parse PushからAmazon SNSへの移行等を参考に、最新の動向などを踏まえて、書かせていただいております。
※Parseの管理画面は、新しいUIを使用していません。環境によっては画面構成が異なる場合があるかと思います。ご了承下さい。
1. Parse のデータをエクスポート
i. Parseにログイン
Parseのダッシュボードに入り、移行したい情報が入っているアプリケーションのCoreを開きましょう。
Push配信用の端末情報を取得したいので、Installationをクリックします。画面に端末情報一覧が表示されるのが確認できると思います。
ii. エクスポート
画面右上に、下矢印が書かれたボックスのアイコンがあります。これをクリックします。
すると、登録しているメールアドレスに、JSONファイル(圧縮されたもの)へのリンクが貼られたメッセージが届きます。コレをダウンロードしましょう。
※ちなみに、1-iで別項目をクリックしていた場合、その項目のデータがダウンロードされます。
iii. JSONを確認
次に 1-ii でダウンロードしたファイルを解凍すると、_Installation.JSONなどの名前のJSONファイルが生成されます。
中身を確認すると、Parse のダッシュボードの項目名が JSON のキーとして存在しているのが確認できます。
2. APNs の証明書をP12として取得
i. Parse から P12ファイルをダウンロード
次に、Push配信用のP12ファイル(Production用)をゲットしましょう。通常は、既にParseで使われているものをダウンロードすればOKです。
Parseのダッシュボード内の、Settings > Pushを開くと、Push配信に関する証明書の設定画面が表示されます。
念のため、期限切れになっていないかExpiration Dateを確認しましょう。ここが過去の日付の場合、すでに証明書は期限切れで無効です。2-iii の方法を使い、新規に作成し、改めてP12ファイルを書き出しましょう。
Apple Push Certificates の中に現在使用している証明書から生成されたP12ファイルがあるかと思います。その右下にある、Download をクリックすると、P12ファイルをゲットできます。
ii. P12ファイル・証明書を探す
もし、P12ファイルが表示されていない場合、皆さんの Mac のローカルディスクなどの中に、該当のP12ファイルがないか探してみてください。
もしくは、キーチェーンアプリ内にP12ファイルの元となった、期限の切れていない証明書があれば、そこから 2-iv の方法で、P12ファイルを書き出すことが出来ます。
iii. 証明書ファイルを生成
証明書やP12ファイルがないか、期限切れになっている場合、新規に作成する必要があります。 以下リンクを参考に、Apple Member Center の Certificates, Identifiers & Profiles(要ログイン)で、Apple Push Notification service SSL (Sandbox & Production)証明書ファイルを生成しましょう。
よく分かる!iOS アプリ開発に必要な証明書ファイルの作成方法 2015年版 | Developers.IO
iv. 証明書をP12として書き出し
ここまでの工程を経て、証明書はあるけどP12ファイルはない、という方は以下を実施しましょう。
まず、Mac の標準アプリキーチェーンアクセスを起動し、左ペインのキーチェーンからログインを、分類から証明書を選択します。
続いて、証明書一覧の中から、必要なものを探します。アプリのBundle Identifier名や、Apple Push Servicesと書かれた項目を探すと、すぐ見つかるでしょう。
証明書が見つかったら、選択し、右クリックします。該当項目を書き出すメニュー項目が表示されますので、クリックします。
続いて表示されるウインドウにおいて、名前でP12ファイルとして書き出したい名前を指定します。場所で書き出し先フォルダを選択します。また、 個人情報交換 (.p12) が選択されていることを確認し、保存をクリックします。
続いて、P12ファイルに設定するパスワードを聞かれます。今回、パスワードを指定せずにそのままOKをクリックしています。
パスワードを入力し、許可を選択し、書き出しを行います。
3. AWS リソース作成
ここでは、すでにAWSアカウントをお持ちの前提で進めていきます。
なお、ここから先は、Amazon SNS (Amazon Simple Notification Service) の機能を使っていきますが、mBaaSとしての機能を補完してくれるMobile Hubを介してAmazon SNSを使っていきます。
若干分かりくいですが、Mobile Hub の Push Notifications は Amazon SNS を利用して実現している、とイメージ頂ければ良いと思います。ちなみに、Mobile Hub は他にもいろんなサービスを提供していますが、その実態は、AWSの別のサービスが担っていたりします。
以下の手順をこなしていけば、データ移行できますので、ご安心ください!
i. Mobile Hub プロジェクトの作成
AWSのマネジメントコンソールトップ画面等から Mobile Hub に入ります。
初めて Mobile Hub のプロジェクトを立ち上げる場合、以下リンク先記事の 3.2.1 ~ 3.2.5 を参考に、進めてください。
AWS Solutions Architect ブログ: Parse PushからAmazon SNSへの移行
すでに、1つ以上 Mobile Hub プロジェクトをお持ちの方は、プロジェクト一覧画面が表示されます。
Create new mobile projectをクリックましょう。
続いて、任意の名前でプロジェクト作成を開始します。
すると、プロジェクトで使える様々なサービスを管理する画面が表示されます。
User Data Storage や User Sign-in、そしてCloud Logicなど、Parseを連想させる機能が揃っていますね。
ii. Push Notifications の設定
ここで、Push Notificationsをクリックします。
続く画面で、Enable Pushをクリックし、iOSをクリックします。
P12 Certificateの下にあるファイルを選択をクリックし、用意したP12ファイルを選択し、Upload certificateをクリックします。
What topics would you like to send push notifications to from your app? が表示されたら、内容を確認し、必要に応じてチェックマークを入れます。どのトピックに向けてプッシュを配信するかを決定します。
トピックは、ここでは、Push送信先のデバイストークン情報などを一括して持つもの、といった感じで捉えて頂ければOKだと思います。
Save changesをクリックします。
iii. Resources
画面左のメニューの Resources をクリックします。
- トピック名: Amazon SNS Topics に書かれた、リンク文字列をメモアプリなどにコピーしておきます。
-
APNs名: Amazon SNS Platform Applications に書かれた、APNS/を除くリンク文字列をコピーしておきます。
これらの情報は後で使うので、コピーしておきましょう。
iv. AWS クレデンシャルの取得
AWSマネジメントコンソールの右上に書かれている、ユーザアカウント名(xxx@xxx-xxx...などと書かれている部分)をクリックし、プルダウンメニューから認証情報をクリックします。
続いて左ペインからユーザーをクリックします。該当するユーザー名をクリックすると、IAMの情報が表示されます。さらに、認証情報タブをクリックし、アクセスキーの追加をクリックします。
Cannot exceed quota for AccessKeysPerUser: x などと表示された場合は、アクセスキーの数がMAXになっていますので、必要ないものがあれば消す、など行ってください。
アクセスキーの作成ウインドウが表示されます。このウインドウに書かれている通り、今回作成したアクセスキーに関して、認証情報をダウンロードできる最後の機会です。
ユーザーのセキュリティ認証情報を表示をクリックすれば、アクセスキーIDとシークレットアクセスキーを直接画面上に表示できます。これを適切な方法・場所において、コピー・保存しておいてもOKです。
認証情報は、後ほど使います。
4. Parseデータのインポート
ココでは、Parseでゲットした JSON データを Mobile Hub 側にコピーします。移行には専用のコマンドラインツール(Java)を使います。
i. Parse Push移行ツールのダウンロード
以下からダウンロードします。
また、このjarファイルを実行するため、Java実行環境がインストールされていなければ、以下からインストールしましょう。
Java SE Runtime Environment 8 - Downloads
こちらから、Mac OS X x64 用の、Java SE Runtime Environment をダウンロードし、インストールします。dmg形式を選択するのが簡単で良いでしょう。
ii. 実行コマンド作成
Parse Push 移行ツールを実行するためのコマンドを書きます。
少々長いので、シェルスクリプトとして保存しておくと、使い回しができて便利でしょう。
内容は以下の通りです。今回は、import.shの名前で、JSONファイルと同じフォルダに保存します。
java -jar SNSImportTool.jar -v -s -f ./xxx.JSON --apnsName <3.iiiのAPNs名> --topicName <3.iiiのトピック名> --awsaccess <3.ivのアクセスキーID> --awssecret <3.ivのシークレットアクセスキー>
※上記で、xxxで表記されている部分は、実際とは異なる(これ以降のログも同様)
※三角カッコ < > は実際には入力しない
iii. JSONファイルの加工
インポートするために、以下コマンドを、ターミナルから実行してみます。
sh import.sh
すると、コマンドが実行されます。しかし、Parse の JSON そのままでは、インポート実行時に以下の様なエラーが出ます。
$ sh importParsePushData2.sh com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "afternoon" (class SNSImportTool$ParseResults$Entry), not marked as ignorable (9 known properties: "badge", "deviceToken", "endpointArn", "updatedAt", "channels", "deviceType", "subscriptionArns", "objectId", "createdAt"]) at [Source: ./parsetosnsall.json; line: 3, column: 25] (through reference chain: ParseResults["results"]->Object[][0]->Entry["afternoon"]) at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:51) (以下略)
移行ツールが対応していない、キーの名前とその値を削除する必要があります。また、元の JSON にない項目を追加する必要があります。
上記エラーを見ると、以下のキーに対応していることが分かります。
- "badge"
- "deviceToken"
- "endpointArn"
- "updatedAt"
- "channels"
- "deviceType"
- "subscriptionArns"
- "objectId"
- "createdAt"
コレ以外のキーが入っているとエラーになるようです。 また、Parseから出力された JSON には、上記の内 "channels" キーがありませんでした。このキーと対応する値がないとエラーが出ます。データの全項目にこのキーと適当な値を追加しましょう。
"channels": ["",""],
JSONから一部抜粋するとこのような形になります。
最終的には、以下のようなJSONファイルを作成しました。
{ "results": [ { "badge": 0, "channels": ["",""], "createdAt": "2016-03-14T03:27:13.688Z", "deviceToken": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "deviceType": "ios", "objectId": "3mfxxxxxxx", "updatedAt": "2016-03-14T03:27:13.688Z" }, { "badge": 0, (以下略)
iv. インポート実行
再度コマンドを実行します。
sh import.sh
すると、ログ出力をしながらデータ移行が実施されます。データ件数に応じて、ログの長さは異なります。
$ sh importParsePushData.sh =========================================== Import from Parse to Amazon SNS =========================================== Verify platform application: app/APNS/parsetoawstest_MOBILEHUB_000000000 {Attributes: {Enabled=true, AppleCertificateExpirationDate=2017-04-13T05:57:25Z}} Created 0 channel topics: Entry(badge=0, channels=[, ], createdAt=2016-03-14T03:27:13.688Z, deviceToken=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx, deviceType=ios, objectId=3mfxxxxxxx, updatedAt=2016-03-14T03:27:13.688Z) now registered as arn:aws:sns:us-east-1:000000000000:endpoint/APNS/parsetoawstest_MOBILEHUB_000000000/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx and subscribed to globalTopic arn:aws:sns:us-east-1:000000000000:parse_parsetoawstest_alldevices_MOBILEHUB_000000000:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Entry(badge=0, channels=[, ], createdAt=2016-03-14T09:47:26.781Z, deviceToken=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx, deviceType=ios, objectId=neSxxxxxxx, updatedAt=2016-03-14T10:10:42.061Z) now registered as arn:aws:sns:us-east-1:000000000000:endpoint/APNS/parsetoawstest_MOBILEHUB_000000000/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx and subscribed to globalTopic arn:aws:sns:us-east-1:404956753679:parse_parsetoawstest_alldevices_MOBILEHUB_000000000/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Mapping of new endpoints to topics Subscriptions in topic parsetoawstest_alldevices_MOBILEHUB_000000000 TopicArn: arn:aws:sns:us-east-1:000000000000:parse_parsetoawstest_alldevices_MOBILEHUB_000000000 arn:aws:sns:us-east-1:000000000000:endpoint/APNS/parsetoawstest_MOBILEHUB_000000000/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx arn:aws:sns:us-east-1:000000000000:endpoint/APNS/parsetoawstest_MOBILEHUB_000000000/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Program has ended, please type 'exit' to close console
正しくデータが移行できたか確認しましょう。
Mobile Hub > 対象アプリケーション > Resources と進み、Amazon SNS Platform Applicationsの中にあるリンク文字列(APNS/から始まるもの)をクリックします。
デバイストークンを含む、端末情報が移行できていることが確認できると思います。
5. Push通知を配信してみる
Amazon SNS から Push を配信してみましょう。
ここでは、特定の端末に向けて、送ってみます。
Tokenの値は、Parseの DeviceToken と同じです。ご自分の特定端末などに向けて Push を送ることが出来ます。
メッセージの内容などを決め、送信します。
iPhoneにPush通知が送られてきました!成功です!
送ったあと、Endpoints 欄の Enabled が true の場合、正常に送られたことがわかります。
逆に、falseの場合、うまく送れなかったということになります。原因はいろいろ考えられますが、例えば、P12ファイルや、その元になった証明書ファイルが正しくない、開発用の物を使っている、期限が切れている、Parseで使っているものとは異なる、などが考えられます。
まとめ
Parse の データを Amazon SNS (Mobile Hub) に移行するのは、一定の手間がかかりますが、順を追っていけば、難しい作業ではない事が分かりました。
ぜひ試してみてください!